﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace ControlPresupuesto
{
    public partial class FrmAdministrarMenu : Form
    {
        private OpcionesMenuEmergente opcionSeleccionada = OpcionesMenuEmergente.VACIO;
        private int NivelMaximo = 0;

        private string IdentificadorRegistroActual = string.Empty; 	//--- en este campo se guardara el identificador del registro que se este consultando.
        
        private String textoOpcion1 = "Eliminar";
        private String textoOpcion2 = "Agregar";
        private String textoOpcion3 = "Subir";
        private String textoOpcion4 = "Bajar";


        public FrmAdministrarMenu()
        {
            InitializeComponent();            
        }

        private void FrmAdministrarMenu_Load(object sender, EventArgs e)
        {
            //-- Blanquear Campos
            Utils.get().blanquearCampos(this);

            //--- Cargar la informacion en el TreeView
            this.cargarInformacionEnAWTreeView();
        }

        private void menuTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            try
            {
                //--Consulto el registro
                this.Cursor = Cursors.WaitCursor;
                this.spSeguridadMenuTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spSeguridadMenu,
                    "Select",
                    null,
                    null,
                    null,
                    null,
                    this.menuTreeView.SelectedNode.Name,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );
                this.Cursor = Cursors.Default;

                //--- Cargo la informacion consultada
                if (this.controlPresupuestoDataSet.spSeguridadMenu.Count > 0)
                {
                    if (this.menuTreeView.SelectedNode.Nodes.Count > 0)
                    {
                        this.formularioTextBox.Text = string.Empty;
                        this.formularioTextBox.ReadOnly = true;
                    }
                    else
                    {
                        this.formularioTextBox.Text = (this.controlPresupuestoDataSet.spSeguridadMenu[0].IsFormularioNull() ? string.Empty : this.controlPresupuestoDataSet.spSeguridadMenu[0].Formulario);
                        this.formularioTextBox.ReadOnly = false;
                    }

                    this.codigoTextBox.Text = this.controlPresupuestoDataSet.spSeguridadMenu[0].Codigo;
                    this.etiquetaTextBox.Text = this.controlPresupuestoDataSet.spSeguridadMenu[0].etiqueta;
                    this.descripcionTextBox.Text = this.controlPresupuestoDataSet.spSeguridadMenu[0].descripcion;
                    this.iconoPictureBox.Image = Utils.get().byteToImage((this.controlPresupuestoDataSet.spSeguridadMenu[0].IsiconoNull() ? null : this.controlPresupuestoDataSet.spSeguridadMenu[0].icono));
                }
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }
        private void menuTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            this.menuTreeView.SelectedNode = e.Node;
        }

        private void MenuClick(object sender, EventArgs e)
        {
            try
            {
                this.opcionSeleccionada = OpcionesMenuEmergente.VACIO;

                if (((ToolStripMenuItem)sender).Tag.ToString().Equals(OpcionesMenuEmergente.Delete.ToString()))
                {
                    if (MessageBox.Show("Desea eliminar el registro?", "Confirmacion", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    {
                        this.opcionSeleccionada = OpcionesMenuEmergente.VACIO;
                        return;
                    }
                    this.opcionSeleccionada = OpcionesMenuEmergente.Delete;
                }
                else if (((ToolStripMenuItem)sender).Tag.ToString().Equals(OpcionesMenuEmergente.Insert.ToString()))
                {
                    if (this.menuTreeView.SelectedNode.Level >= this.NivelMaximo && this.NivelMaximo > 0)
                    {
                        MessageBox.Show("No puede agregar mas nodos al nodo seleccionado. Se sobrepasa el nivel maximo permitido (" + this.NivelMaximo + ").");
                        this.opcionSeleccionada = OpcionesMenuEmergente.VACIO;
                        return;
                    }
                    else
                    {
                        this.opcionSeleccionada = OpcionesMenuEmergente.Insert;
                    }
                }
                else if (((ToolStripMenuItem)sender).Tag.ToString().Equals(OpcionesMenuEmergente.SubirOpcion.ToString()))
                {
                    this.opcionSeleccionada = OpcionesMenuEmergente.SubirOpcion;
                }
                else if (((ToolStripMenuItem)sender).Tag.ToString().Equals(OpcionesMenuEmergente.BajarOpcion.ToString()))
                {
                    this.opcionSeleccionada = OpcionesMenuEmergente.BajarOpcion;
                }

                if (!this.opcionSeleccionada.Equals(OpcionesMenuEmergente.VACIO))
                {
                    this.spSeguridadMenuTableAdapter.FillBy(
                        this.controlPresupuestoDataSet.spSeguridadMenu,
                        this.opcionSeleccionada.ToString(),
                        null,
                        null,
                        null,
                        null,
                        this.menuTreeView.SelectedNode.Name,
                        this.menuTreeView.SelectedNode.Name, //--- Coloco el codigo en esta parte para poder insertar registros.
                        null,
                        null,
                        null,
                        null,
                        null
                    );

                    //--- Refresco la pantalla...
                    this.cargarInformacionEnAWTreeView();
                }
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void InicializarAWTreeView()
        {
            foreach (TreeNode temp in this.menuTreeView.Nodes)
            {
                this.inicializarNodos(this.menuTreeView, temp);
            }
        }
        private void inicializarNodos(TreeView treeView, TreeNode node)
        {
            try
            {
                foreach (TreeNode temp in node.Nodes)
                {
                    this.inicializarNodos(treeView, temp);
                }

                ContextMenuStrip menu = new ContextMenuStrip();
                node.ContextMenuStrip = menu;
                ToolStripMenuItem MLabel1 = new ToolStripMenuItem();
                MLabel1.Click += new System.EventHandler(this.MenuClick);
                MLabel1.Text = this.textoOpcion1;
                MLabel1.Tag = OpcionesMenuEmergente.Delete.ToString();
                ToolStripMenuItem MLabel2 = new ToolStripMenuItem();
                MLabel2.Click += new System.EventHandler(this.MenuClick);
                MLabel2.Text = this.textoOpcion2;
                MLabel2.Tag = OpcionesMenuEmergente.Insert.ToString();
                ToolStripMenuItem MLabel3 = new ToolStripMenuItem();
                MLabel3.Click += new System.EventHandler(this.MenuClick);
                MLabel3.Text = this.textoOpcion3;
                MLabel3.Tag = OpcionesMenuEmergente.SubirOpcion.ToString();
                ToolStripMenuItem MLabel4 = new ToolStripMenuItem();
                MLabel4.Click += new System.EventHandler(this.MenuClick);
                MLabel4.Text = this.textoOpcion4;
                MLabel4.Tag = OpcionesMenuEmergente.BajarOpcion.ToString();
                menu.Items.AddRange(new ToolStripMenuItem[] { MLabel1, MLabel2, MLabel3, MLabel4 });
            }
            catch (Exception e)
            {
                MessageException.show(e);
                return;
            }
        }

        private void cargarInformacionEnAWTreeView()
        {
            //--- Limpio el control y cargo un unico nodo que permitira agregar mas nodos al control
            try
            {
                //--- limpio los campos de la ventana
                this.formularioTextBox.ReadOnly = false;
                this.codigoTextBox.Text = string.Empty;
                this.descripcionTextBox.Text = string.Empty;
                this.etiquetaTextBox.Text = string.Empty;
                this.formularioTextBox.Text = string.Empty;
                this.iconoPictureBox.Image = null;
                

                this.menuTreeView.Nodes.Clear();
                TreeNode temp = new TreeNode();
                temp.Name = "";
                temp.Text = "MENU DE LA APLICACION";
                temp.Tag = "";
                this.menuTreeView.Nodes.Add(temp);
                //--- Cargar todos los nodos desde la BD de forma recursiva
                this.cargarInformacionEnAWTreeView(temp, null);
                //--- Hasta este punto ya debieron haberse cargado todos los elementos del control, a continuacion les agrego los menus emergentes
                this.InicializarAWTreeView();
                //--- expando el arbol
                this.menuTreeView.ExpandAll();
            }
            catch (Exception e)
            {
                MessageException.show(e);
            }
        }
        private void cargarInformacionEnAWTreeView(Object awTreeView, string CodigoSuperior)
        {
            try
            {
                ControlPresupuestoDataSet.spSeguridadMenuDataTable table = new ControlPresupuestoDataSet.spSeguridadMenuDataTable();

                this.spSeguridadMenuTableAdapter.FillBy(
                    table,
                    "SelectHijos",
                    null,
                    null,
                    null,
                    null,
                    CodigoSuperior,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                );
                //--- Obtengo la informacion del control desde la BD

                if (table.Count == 0)
                {
                    return;
                }
                foreach (DataRow R in table.Rows)
                {
                    TreeNode temp = new TreeNode();
                    temp.Name = R["Codigo"].ToString();
                    temp.Text = R["Etiqueta"].ToString().Replace("&", "");
                    temp.Tag = R["Codigo"].ToString();
                    ((TreeNode)awTreeView).Nodes.Add(temp);
                    this.cargarInformacionEnAWTreeView(temp, R["Codigo"].ToString());
                }
            }
            catch (Exception e)
            {
                MessageException.show(e);
            }
        }

        #region Eventos y funciones para el control de icono
        
        private void iconoPictureBox_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                if (this.iconoPictureBox.Image != null)
                {
                    if (MessageBox.Show("Desea Borrar la imagen?", "Confirmacion", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        this.iconoPictureBox.Image = null;
                    }
                }
                return;
            }

            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                this.Cursor = Cursors.WaitCursor;

                OpenFileDialog saveFileDialog = new OpenFileDialog();
                saveFileDialog.Filter = "(*.png)|*.png";//"txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.Multiselect = false;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    this.Cursor = Cursors.Default;
                    return;
                }
                this.iconoPictureBox.Image = Utils.get().fileToImage(saveFileDialog.FileName);
                this.Cursor = Cursors.Default;
                return;
            }
        }
    
        #endregion

        private void guardarButton_Click(object sender, EventArgs e)
        {
            if (this.codigoTextBox.Text.Equals(string.Empty))
            {
                return;
            }

            if (this.formularioTextBox.Text.Trim().Equals(string.Empty) && !this.formularioTextBox.ReadOnly)
            {
                MessageBox.Show("Debe ingresar el formulario");
                return;
            }
            if (this.etiquetaTextBox.Text.Trim().Equals(string.Empty) && this.iconoPictureBox.Image==null)
            {
                MessageBox.Show("Debe ingresar la etiqueta o el icono a la opción.");
                return;
            }
            
            try
            {
                this.spSeguridadMenuTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spSeguridadMenu,
                    "Update",
                    null,
                    null,
                    null,
                    null,
                    this.codigoTextBox.Text.Trim(),
                    null,
                    null,
                    (this.formularioTextBox.ReadOnly || this.formularioTextBox.Text.Trim().Equals(string.Empty) ? null : this.formularioTextBox.Text),
                    this.etiquetaTextBox.Text.Trim(),
                    this.descripcionTextBox.Text.Trim(),
                    Utils.get().imageToByte(this.iconoPictureBox.Image)
                );
                //--- Refresco la pantalla...
                this.cargarInformacionEnAWTreeView();
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }
    }
}
